package com.lihaozhe.controller;

import com.lihaozhe.util.response.ResponseResult;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * @author 李昊哲
 * @version 1.0
 * 2021/12/1 上午11:45
 * @EnableGlobalMethodSecurity(prePostEnabled=true)的时候，@PreAuthorize可以使用：@Secured可以使用：
 */
@Controller
@RequestMapping("/admin")
public class AdminController {
    /**
     * @Secured
     * @EnableGlobalMethodSecurity(prePostEnabled=true)的时候，@Secured可以使用：
     * 拥有normal或者admin角色的用户都可以方法toAdmin()方法。另外需要注意的是这里匹配的字符串需要添加前缀“ROLE_“。
     * 如果我们要求，只有同时拥有admin & noremal的用户才能方法toAdmin()方法，这时候@Secured就无能为力了。
     *
     * @EnableGlobalMethodSecurity(prePostEnabled=true)的时候，@PreAuthorize可以使用：
     * 拥有normal或者admin角色的用户都可以方法toAdmin()方法。@PreAuthorize("hasAnyRole('normal','admin')")
     * 此时如果我们要求用户必须同时拥有normal和admin的话，那么可以这么编码：@PreAuthorize("hasRole('normal') AND hasRole('admin')")
     *
     * 当@EnableGlobalMethodSecurity(prePostEnabled=true)的时候，@PostAuthorize可以使用：
     * @PostAuthorize 注解使用并不多，在方法执行后再进行权限验证，适合验证带有返回值的权限，
     * Spring EL 提供 返回对象能够在表达式语言中获取返回的对象returnObject。
     * @return
     */
    @Secured({"ROLE_admin"})
    @PreAuthorize("hasAnyRole('admin','user')")
    @GetMapping("/toAdmin")
    public String toAdmin() {
        return "admin";
    }
}